/**
 * 
 */
package com.erbaoshen.util;

import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.erbaoshen.model.FileModel;

/**
 * @author Administrator
 * 文件工具类
 */
public class ErBaoFileUtil {
	
	/**
	 * 把字符串写入文件
	 * @param file 需要写入的文件，如果文件不存在，将自动创建。
	 * @param data 需要写入的内容
	 * @param encoding 编码格式["UTF-8"]
	 * @param append 是否为追加模式（ ture: 追加模式，把字符串追加到原内容后面，追加内容不换行；false: 覆盖模式，覆盖原内容）
	 */
	public static void writeStringToFile(final File file, final String data, final boolean append) {
		Charset encoding = Charset.forName("UTF-8"); // 编码格式["UTF-8"]
		try {
			FileUtils.writeStringToFile(file, data, encoding, append);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	/**
	 * 把字符串写入文件
	 * 
	 * @param file
	 * @param data
	 */
	public static void writeLines(final File file, final List<String> data) {
		try {
            FileUtils.writeLines( file, data, true);
        }catch (Exception e) {
            e.printStackTrace();
        }
	}
	
	/**
	 * 把字符串写入文件[一个list元素一行]
	 * @param path 需要写入的文件，如果文件不存在，将自动创建。
	 * @param lines 需要写入的内容
	 */
	public static void filesWrite(String path, List<String> lines) {
		try {
			Path textFile = Paths.get(path);
			Charset charset = Charset.forName("UTF-8"); // 编码格式["UTF-8"]
			Files.write(textFile, lines, charset);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取盘符下子、文件子文件夹
	 * @param dir 指定盘符
	 * @return
	 */
	public static List<File> searchFileInDir(File dir) {
		List<File> list = new ArrayList<>();
		File[] files = dir.listFiles();
		if (files != null && files.length != 0) {
			for (File file : files) {
				list.add(file);
			}
		}
		return list;
	}
	
	/**
	 * 获取盘符下所有子、文件子文件夹
	 * @param dir 指定盘符
	 * @return
	 */
	public static List<File> searchAllInDir(File dir) {
		List<File> list = new ArrayList<>();
		File[] files = dir.listFiles();
		if (files != null && files.length != 0) {
			for (File file : files) {
				list.add(file);
				if (file.isDirectory() && files.length < 50) {
					List<File> listIN = searchAllInDir(file);
					list.addAll(listIN);
				}
			}
		}
		return list;
	}
	
	/**
	 * 获取所有盘符
	 * @return
	 */
	public static List<File> listRoots(){
		File[] files = File.listRoots();
		return Arrays.asList(files);
	}
	
	/**
	 * 获取文件大小
	 * @param size
	 * @return
	 */
	public static String byteCountToDisplaySize(File file) {
		return FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(file));
	}
	
	/**
	 * 将文件转为文件对象
	 * @param fileList
	 * @return
	 */
	public static List<FileModel> listFileToModel(List<File> fileList){
		List<FileModel> listModel = new ArrayList<FileModel>();
		int len = fileList.size();
		for (int i = 0; i < len; i++) {
			// 文件大小
			String fileSize = ErBaoFileUtil.byteCountToDisplaySize(fileList.get(i));
			FileModel fileModel = new FileModel();
			fileModel.setName(fileList.get(i).getName());
			fileModel.setPath(fileList.get(i).getPath());
			fileModel.setSize(fileSize);
			fileModel.setCanRead(fileList.get(i).canRead());
			fileModel.setCanWrite(fileList.get(i).canWrite());
			listModel.add(fileModel);
		}
		return listModel;
	}
	
	/**
	 * 将文件列表转为文件对象字符串
	 * @param fileList
	 * @return
	 */
	public static List<String> listFileToModelString(List<File> fileList){
		List<String> listString = new ArrayList<String>();
		int len = fileList.size();
		for (int i = 0; i < len; i++) {
			// 文件大小
//			String fileSize = ErBaoFileUtil.byteCountToDisplaySize(fileList.get(i));
			String fileSize = FileUtils.byteCountToDisplaySize(fileList.get(i).length());
			FileModel fileModel = new FileModel();
			fileModel.setName(fileList.get(i).getName());
			fileModel.setPath(fileList.get(i).getPath());
			fileModel.setSize(fileSize);
			fileModel.setCanRead(fileList.get(i).canRead());
			fileModel.setCanWrite(fileList.get(i).canWrite());
			String modelString = ErBaoFastJsonUtil.toJSONNoFeatures(fileModel);
			listString.add(modelString);
		}
		return listString;
	}
	
}
